<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>テンプレートリソース</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.75.1">
<link rel="home" href="index.html" title="Smarty マニュアル">
<link rel="up" href="advanced.features.html" title="Chapter 15. 拡張機能">
<link rel="prev" href="section.template.cache.handler.func.html" title="キャッシュハンドラ関数">
<link rel="next" href="plugins.html" title="Chapter 16. プラグインによる Smarty の拡張">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<div class="navheader">
<table width="100%" summary="Navigation header">
<tr><th colspan="3" align="center">テンプレートリソース</th></tr>
<tr>
<td width="20%" align="left">
<a accesskey="p" href="section.template.cache.handler.func.html">Prev</a> </td>
<th width="60%" align="center">Chapter 15. 拡張機能</th>
<td width="20%" align="right"> <a accesskey="n" href="plugins.html">Next</a>
</td>
</tr>
</table>
<hr>
</div>
<div class="sect1" title="テンプレートリソース">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
<a name="template.resources"></a>テンプレートリソース</h2></div></div></div>
<p>
   テンプレートは様々なリソースから呼び出して使用できます。テンプレートを
  <a class="link" href="api.display.html" title="display()"><code class="varname">display()</code></a>、
  <a class="link" href="api.fetch.html" title="fetch()"><code class="varname">fetch()</code></a>
   したり別のテンプレートからインクルードしたりする際には、
   リソースの種類に続けて適切なパスとテンプレート名を指定します。
   リソースを明示的に指定しない場合は <a class="link" href="variable.default.resource.type.html" title="$default_resource_type">
    <em class="parameter"><code>$default_resource_type</code></em></a> の値であるとみなします。
   </p>
<div class="sect2" title="$template_dir からのテンプレート">
<div class="titlepage"><div><div><h3 class="title">
<a name="templates.from.template.dir"></a>$template_dir からのテンプレート</h3></div></div></div>
<p>
     <a class="link" href="api.variables.html#variable.template.dir" title="$template_dir">
     <em class="parameter"><code>$template_dir</code></em></a> からのテンプレートを使用する場合は、
     テンプレートリソースの指定は必要ありません。しかし、一貫性を保つために
     <code class="literal">file:</code> リソースを使用してもかまいません。使用したいテンプレートへのパスを、
     <a class="link" href="api.variables.html#variable.template.dir" title="$template_dir">
     <em class="parameter"><code>$template_dir</code></em></a>
     のルートディレクトリからの相対パスで指定します。
    </p>
<div class="example">
<a name="id2857099"></a><p class="title"><b>Example 15.6. $template_dir のテンプレートを使用する</b></p>
<div class="example-contents">
<pre class="programlisting">

&lt;?php
$smarty-&gt;display('index.tpl');
$smarty-&gt;display('admin/menu.tpl');
$smarty-&gt;display('file:admin/menu.tpl'); // 上と同じ
?&gt;

</pre>
<p>Smarty のテンプレート</p>
<pre class="programlisting">

{include file='index.tpl'}
{* 以下は、上と同じです *}
{include file='file:index.tpl'}

</pre>
</div>
</div>
<br class="example-break">
</div>
<div class="sect2" title="任意のディレクトリからのテンプレート">
<div class="titlepage"><div><div><h3 class="title">
<a name="templates.from.any.dir"></a>任意のディレクトリからのテンプレート</h3></div></div></div>
<p>
     <a class="link" href="api.variables.html#variable.template.dir" title="$template_dir">
     <em class="parameter"><code>$template_dir</code></em></a>
     の外に置かれたテンプレートを使うには、リソースの種類
     <code class="literal">file:</code> を指定しなければなりません。
     その後にテンプレートへの絶対パスを続けます。
    </p>
<div class="example">
<a name="id2857173"></a><p class="title"><b>Example 15.7. 任意のディレクトリからのテンプレートを使用する</b></p>
<div class="example-contents">
<pre class="programlisting">

&lt;?php
$smarty-&gt;display('file:/export/templates/index.tpl');
$smarty-&gt;display('file:/path/to/my/templates/menu.tpl');
?&gt;

     </pre>
<p>
      Smarty のテンプレート
     </p>
<pre class="programlisting">

{include file='file:/usr/local/share/templates/navigation.tpl'}

     </pre>
</div>
</div>
<br class="example-break"><div class="sect3" title="Windows のファイルパス">
<div class="titlepage"><div><div><h4 class="title">
<a name="templates.windows.filepath"></a>Windows のファイルパス</h4></div></div></div>
<p>
      通常、Windows 環境の場合はファイルパスの先頭にドライブレター (C:)
      が含まれます。ネームスペースの衝突を回避して期待通りの結果を得るために、
      必ず <code class="literal">file:</code> を使用して下さい。
     </p>
<div class="example">
<a name="id2857234"></a><p class="title"><b>Example 15.8. Windows ファイルパスからテンプレートを使用する</b></p>
<div class="example-contents">
<pre class="programlisting">

&lt;?php
$smarty-&gt;display('file:C:/export/templates/index.tpl');
$smarty-&gt;display('file:F:/path/to/my/templates/menu.tpl');
?&gt;

     </pre>
<p>
      Smarty テンプレート
     </p>
<pre class="programlisting">

{include file='file:D:/usr/local/share/templates/navigation.tpl'}

</pre>
</div>
</div>
<br class="example-break">
</div>
</div>
<div class="sect2" title="その他のリソース内のテンプレート">
<div class="titlepage"><div><div><h3 class="title">
<a name="templates.from.elsewhere"></a>その他のリソース内のテンプレート</h3></div></div></div>
<p>
     データベース・ソケット・LDAP 等の
     PHPによってアクセス可能なリソースからテンプレートを取得する事ができます。
     そのためにはリソースプラグイン関数を記述し、それを登録する必要があります。
    </p>
<p>
     リソースプラグイン関数についての詳細な情報は
     <a class="link" href="plugins.resources.html" title="リソースプラグイン">リソースプラグイン</a>
     の項を参照してください。
    </p>
<div class="note" title="Note" style="margin-left: 0.5in; margin-right: 0.5in;">
<h3 class="title">Note</h3>
<p>
      元から存在する <code class="literal">file:</code> リソースは上書きできないことに注意しましょう。
      しかし、ファイルシステム上のテンプレートを別の方法で取得するテンプレートを作成することはできます。
      それを別のリソース名で登録すればよいのです。
     </p>
</div>
<div class="example">
<a name="id2857331"></a><p class="title"><b>Example 15.9. カスタムリソースを使用する</b></p>
<div class="example-contents">
<pre class="programlisting">

&lt;?php
// これらの関数をアプリケーションに追加します
function db_get_template ($tpl_name, &amp;$tpl_source, &amp;$smarty_obj)
{
    // ここでデータベースを呼び出し、取得した実際のテンプレートを
    // $tpl_source に代入します
    $tpl_source = "This is the template text";
    // 成功した場合に true を返します。false を返すと失敗したことになります
    return true;
}

function db_get_timestamp($tpl_name, &amp;$tpl_timestamp, &amp;$smarty_obj)
{
    // テンプレートの最終更新時刻の Unix タイムスタンプを
    // $tpl_timestampに代入するためにデータベースを呼び出します
    // これで、再コンパイルが必要かどうかを判断します
    $tpl_timestamp = time(); // この例だと常に再コンパイルとなります!
    // 成功した場合に true を返します。false を返すと失敗したことになります
    return true;
}

function db_get_secure($tpl_name, &amp;$smarty_obj)
{
    // 全てのテンプレートがセキュアであると仮定します
    return true;
}

function db_get_trusted($tpl_name, &amp;$smarty_obj)
{
    // テンプレートから使用しません
}

// テンプレートリソース名"db"を登録します
$smarty-&gt;register_resource("db", array("db_get_template",
                                       "db_get_timestamp",
                                       "db_get_secure",
                                       "db_get_trusted"));

// phpスクリプトからテンプレートリソースを使用します
$smarty-&gt;display("db:index.tpl");
?&gt;

     </pre>
<p>
      Smarty テンプレート
     </p>
<pre class="programlisting">

{include file='db:/extras/navigation.tpl'}

     </pre>
</div>
</div>
<br class="example-break">
</div>
<div class="sect2" title="デフォルトのテンプレートハンドラ関数">
<div class="titlepage"><div><div><h3 class="title">
<a name="default.template.handler.function"></a>デフォルトのテンプレートハンドラ関数</h3></div></div></div>
<p>
     テンプレートリソースからテンプレートの取得に失敗した際に、
     テンプレートのコンテンツを取り戻すために呼び出されるユーザ定義関数を指定します。
     この関数の使用方法の１つとして、その場限りのテンプレートを作成する処理を行います。
    </p>
<div class="example">
<a name="id2857384"></a><p class="title"><b>Example 15.10. デフォルトのテンプレートハンドラ関数を使用する</b></p>
<div class="example-contents"><pre class="programlisting">

&lt;?php
// アプリケーション内のどこかでこの関数を呼び出します

function make_template ($resource_type, $resource_name, &amp;$template_source, &amp;$template_timestamp,
&amp;$smarty_obj)
{
	if( $resource_type == 'file' ) {
		if ( ! is_readable ( $resource_name )) {
			// テンプレートファイルを生成し、コンテンツを返します
			$template_source = "This is a new template.";
            require_once SMARTY_CORE_DIR . 'core.write_file.php';
            smarty_core_write_file( array( 'filename'=&gt;$smarty_obj-&gt;template_dir . DIRECTORY_SEPARATOR . $resource_name, 'contents'=&gt;$template_source ), $smarty_obj ); 
			return true;
		}
    } else {
		// ファイルではない場合
		return false;
    }
}

// デフォルトのハンドラをセット
$smarty-&gt;default_template_handler_func = 'make_template';
?&gt;

     </pre></div>
</div>
<br class="example-break">
</div>
</div>
<div class="navfooter">
<hr>
<table width="100%" summary="Navigation footer">
<tr>
<td width="40%" align="left">
<a accesskey="p" href="section.template.cache.handler.func.html">Prev</a> </td>
<td width="20%" align="center"><a accesskey="u" href="advanced.features.html">Up</a></td>
<td width="40%" align="right"> <a accesskey="n" href="plugins.html">Next</a>
</td>
</tr>
<tr>
<td width="40%" align="left" valign="top">キャッシュハンドラ関数 </td>
<td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td>
<td width="40%" align="right" valign="top"> Chapter 16. プラグインによる Smarty の拡張</td>
</tr>
</table>
</div>
</body>
</html>
